Go 的日志包 glog
glog 是一个 C++ 上的 glog 日志框架的 Golang 版本,基本实现了原生 glog 的日志格式。在 Kuberntes 中,glog 是默认日志库。
go get github.com/golang/glog
glog 将日志级别分为 4 种,分别是:
- INFO:普通日志;
- WARNING:告警日志;
- ERROR:错误日志;
- FATAL:严重错误日志,打印完日志后程序将会推出
os.Exit()
glog 的使用很简单,可参考下面这个例子:
package main
import (
"flag"
"github.com/golang/glog"
)
func main() {
flag.Parse()
defer glog.Flush()
glog.Info("This is info message")
glog.Infof("This is info message: %v", 12345)
glog.InfoDepth(1, "This is info message", 12345)
glog.Warning("This is warning message")
glog.Warningf("This is warning message: %v", 12345)
glog.WarningDepth(1, "This is warning message", 12345)
glog.Error("This is error message")
glog.Errorf("This is error message: %v", 12345)
glog.ErrorDepth(1, "This is error message", 12345)
glog.Fatal("This is fatal message")
glog.Fatalf("This is fatal message: %v", 12345)
glog.FatalDepth(1, "This is fatal message", 12345)
}
当我们运行:
$ mkdir -p log \
&& go run main.go -log_dir=log
以上打印日志将会同时打印在 log/ 目录
这些 flag 参考文档 setting-flags
日志级别功能
glog 最常用的就是 V level 的功能,如下所示:
func main() {
flag.Parse()
defer glog.Flush()
glog.V(3).Info("LEVEL 3 message") // 使用日志级别 3
glog.V(4).Info("LEVEL 4 message") // 使用日志级别 4
glog.V(5).Info("LEVEL 5 message") // 使用日志级别 5
glog.V(8).Info("LEVEL 8 message") // 使用日志级别 8
}
当我们重新运行:
$ go run main.go -log_dir=log -alsologtostderr
将不会看到任何输出,因为日志级别不够
可以通过指定日志级别(-v,log level):
$ go run main.go -v=4 -log_dir=log -alsologtostderr
此时,日志级别小于或等于 4 的日志将被打印出来:
如果我们想对不同的文件实行不同的日志级别,可以用 vmodule 功能,如下代码:
func main() {
flag.Parse()
defer glog.Flush()
bar()
glog.V(3).Info("LEVEL 3 message")
glog.V(4).Info("LEVEL 4 message")
glog.V(5).Info("LEVEL 5 message")
glog.V(8).Info("LEVEL 8 message")
}
其中 bar()
的实现在 bar.go:
func bar() {
glog.V(4).Info("LEVEL 4: level 4 message in bar.go")
}
当我们执行:
$ go run main.go bar.go -v=3 -log_dir=log -alsologtostderr -vmodule=bar=5
-vmodule 的输入参数省去 .go 后缀,且必须以 -vmodule=recordio=2,file=1,gfs*=3 的语法格式
对所有文件的日志级别设定为 3 (-v=3),但是对 bar.go 的日志级别设定为 5,此时会输出:
I0715 13:20:28.381611 30447 bar.go:6] LEVEL 4: level 4 message in bar.go
I0715 13:20:28.383866 30447 main.go:14] LEVEL 3 message
打印堆栈信息
traceLocation 的命令格式为 -log_backtrace_at=gopherflakes.go:234
,当运行到指定代码处时,将把该代码的栈信息打印出来,延续上面的代码,我们运行:
$ go run main.go bar.go -v=3 -log_dir=log -alsologtostderr -vmodule=bar=5 -log_backtrace_at=bar.go:6
可见如下输出:
I0715 13:28:17.915837 31920 bar.go:6] LEVEL 4: level 4 message in bar.go
... 打印 backtrace,此处省略 ...
I0715 13:28:17.923715 31920 main.go:14] LEVEL 3 message